package modelo.AlgoHero;
import java.util.ArrayList;
import java.util.Iterator;

import modelo.Excepciones.ObjetoSinMasElementosExcepcion;



public class CompasTraducido extends ObjetoTraducido {

	private ArrayList <PartituraTraducida> listaDePartiturasTraducidas;
		
	/**
	 * Constructor sin parametros
	 */
	public CompasTraducido(){
		
		this.listaDePartiturasTraducidas = new ArrayList<PartituraTraducida>();
				
	}
	
	/**
	 * Metodo que se utiliza para agregar partiturasTraducidas al compasTraducido
	 * @param partituraTraducida
	 */
	public void add(PartituraTraducida partituraTraducida){
		
		this.listaDePartiturasTraducidas.add(partituraTraducida);
		
	}
	
	/**
	 * Devuelve el proximo elemento de cada una de las partiruras en un conjunto
	 * @throws ObjetoSinMasElementosExcepcion 
	 */

	public ConjuntoElementosReproducibles getConjuntoReproducible() throws ObjetoSinMasElementosExcepcion {

		ConjuntoElementosReproducibles conjunto = new ConjuntoElementosReproducibles ();
		Iterator <PartituraTraducida> iteradorCompas = this.listaDePartiturasTraducidas.iterator();

		while (iteradorCompas.hasNext()){
			
			PartituraTraducida partituraTraducida = iteradorCompas.next();
			
			if (!partituraTraducida.hasNext()) throw new ObjetoSinMasElementosExcepcion ();
			
			ConjuntoElementosReproducibles conjuntoAuxiliar;
			
			if (partituraTraducida.hasNext()){
				
				conjuntoAuxiliar = partituraTraducida.getConjuntoReproducible();
			    
				conjunto.add(conjuntoAuxiliar.next()); // Agrega al conjunto reproducible el elemento reproducible siguiente de la partitura

			}
			
		}
		return conjunto;
	}
	
	/**
	 * Metodo que devuelve TRUE si las partituras del compas actual no han sido recorridas en su totalidad
	 * @return
	 */
	public Boolean hasNext(){
		
		Iterator <PartituraTraducida> iteradorCompas = this.listaDePartiturasTraducidas.iterator();
		
		if (!iteradorCompas.hasNext()) return false;
		
		PartituraTraducida partituraTraducida = iteradorCompas.next();
		
		return partituraTraducida.hasNext();
		
	}
	
	/**
	 * Metodo que se utiliza para comparar un Compas Traducido con otro.
	 * Devuelve true si contienen los mismos datos, y false de lo contrario
	 */
	
	public Boolean compareTo (ObjetoTraducido compas){
	
		while (this.hasNext()){
			
			if (!compas.hasNext()) return false;

			try {
				ConjuntoElementosReproducibles conjunto1 = this.getConjuntoReproducible();
				ConjuntoElementosReproducibles conjunto2 = compas.getConjuntoReproducible();
				
				if (conjunto1.compareTo(conjunto2)==false) return false;
				
			} catch (ObjetoSinMasElementosExcepcion e) {
				e.printStackTrace();
			}
		}
		if (compas.hasNext()) return false;	

		return true;
	}


}
